Searches all files in the current directory for "category: linux" which can be saved to a text file grep -iRl "category: linux" ./
The listoffiles from above can be passed to the mv or cp command
for file in cat listoffiles
; do mv "$file" /path/of/destination ; done
rename "s/ //g" or rename "s/-- //g" to fill the spaces with -
If you don't have rename or prefer to use just the shell:
for f in *\ *; do mv "\(f" "\){f// /-}"; done
Broken down:
*\ * selects all files with a space in their name as input for the the for loop. The quotes around "$f" are important because we know there's a space in the filename and otherwise it would appear as 2+ arguments to mv. ${f//str/new_str} is a bash-specific string substitution feature. All instances of str are replaced with new_str.
To get the ^M character, type Control-v and hit Enter :%s/\r//g or %s/ //gc
I have a bunch of files in a directory, and I need to insert a line of text into each of them. They have essentially the following format:
--- date: 2011-05-19 layout: post title: Preparations category: blog tags: - cycling ---
And I'd like to insert author: Flo before the tags:
for i in ; do sed -i 's/tags:/author: Flo\ntags:/' "i"; done
:%norm A*
This is what it means: % = for every line norm = type the following commands A* = append '*' to the end of current line
find . -type f -name 'words-to-be-replaced*' | while read FILE ; do newfile="\((echo \){FILE} |sed -e 's/words-to-be-replaced/replacedment-words-here/')" ; mv "\({FILE}" "\){newfile}" ;done